﻿using MugenInjection.Infrastructure;
using MugenInjection.Interface;

namespace MugenInjection.Syntax.Type
{
    /// <summary>
    /// Specific fluent syntax for type binding.
    /// </summary>
    public interface ITypePrioritySyntax : IBindingBuilder
    {
        /// <summary>
        /// Sets the priority for binding.
        /// </summary>
        /// <param name="priority">The specified <see cref="BindingPriority"/>.</param>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax SetPriority(BindingPriority priority);

        /// <summary>
        /// Sets standard priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax SetStandardPriority();

        /// <summary>
        /// Sets low priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax SetLowPriority();

        /// <summary>
        /// Sets normal priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax SetNormalPriority();

        /// <summary>
        /// Sets high priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax SetHighPriority();
    }

    /// <summary>
    /// Specific fluent syntax for type binding.
    /// </summary>
    public interface ITypePrioritySyntax<T> : IBindingBuilder
    {
        /// <summary>
        /// Sets the priority for binding.
        /// </summary>
        /// <param name="priority">The specified <see cref="BindingPriority"/>.</param>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax<T> SetPriority(BindingPriority priority);

        /// <summary>
        /// Sets a standard priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax<T> SetStandardPriority();

        /// <summary>
        /// Sets a low priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax<T> SetLowPriority();

        /// <summary>
        /// Sets a normal priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax<T> SetNormalPriority();

        /// <summary>
        /// Sets a high priority for binding.
        /// </summary>
        /// <returns>The fluent syntax.</returns>
        ITypeCallbackObjectUseWithSyntax<T> SetHighPriority();
    }
}